package io.oschina.binv.kapp.framework

import android.app.Application
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import com.alibaba.sdk.android.man.MANServiceProvider
import com.taobao.sophix.PatchStatus
import com.taobao.sophix.SophixManager
import io.oschina.binv.kapp.BuildConfig
import io.oschina.binv.kapp.framework.extend.printOrReport
import io.oschina.binv.kapp.framework.utils.Logger
import io.oschina.binv.kapp.framework.widget.MediaPicker
import kotlin.properties.Delegates


/**
 * Created by xuybin on 2017/8/24.
 */
class BaseApplication : Application() {
    val Log= Logger(this::class.java.canonicalName)
    companion object {
        var instance: BaseApplication by Delegates.notNull()
        var baseUrl = ""
    }
    override fun attachBaseContext(base: Context) {
        // 在这里调用Context的方法会崩溃
        super.attachBaseContext(base);
        // 在这里可以正常调用Context的方法
        initHotfix()
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
        initMetaData()
        initCloudAnalytics()
        queryAndLoadNewPatch()
        MediaPicker.initMediaPicker(this)
    }

    /**
     * 初始化是否是debug
     */
    private fun initMetaData() {
        try {
            val appInfo: ApplicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
            baseUrl =appInfo.metaData.getString("BASE_URL","")
        } catch (e: PackageManager.NameNotFoundException) {
            e.printStackTrace()
        }
    }

    /**
     * 查询热修复补丁并加载
     */
    private fun queryAndLoadNewPatch(){
        try {
            // queryAndLoadNewPatch不可放在attachBaseContext 中，否则无网络权限，建议放在后面任意时刻，如onCreate中
            SophixManager.getInstance().queryAndLoadNewPatch();
        }catch (ex:Throwable){
            this.printOrReport(ex)
        }
    }

    /**
     * 初始热修复
     */
    private fun initHotfix(){
        try {
            // initialize最好放在attachBaseContext最前面
            SophixManager.getInstance().setContext(this)
                    .setAppVersion(BuildConfig.VERSION_NAME)
                    .setAesKey(null)
                    .setEnableDebug(false)
                    .setPatchLoadStatusStub { mode, code, info, handlePatchVersion ->
                        Log.i("Mode:$mode Code:$code  Info:$info HandlePatchVersion:$handlePatchVersion")
                        // 补丁加载回调通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明补丁加载成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀，以此加快应用补丁，详见1.3.2.3
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                        }
                    }.initialize()
        }catch (ex:Throwable){
            this.printOrReport(ex)
        }
    }

    /**
     * 初始化阿里云分析通道
     */
    private fun initCloudAnalytics() {
        try {
            /* 【注意】建议您在Application中初始化MAN，以保证正常获取MANService*/
            // 获取MAN服务
            val manService = MANServiceProvider.getService()
            // 打开调试日志，线上版本建议关闭
            // manService.getMANAnalytics().turnOnDebug()
            // 设置渠道（用以标记该app的分发渠道名称），如果不关心可以不设置即不调用该接口，渠道设置将影响控制台【渠道分析】栏目的报表展现。如果文档3.3章节更能满足您渠道配置的需求，就不要调用此方法，按照3.3进行配置即可；1.1.6版本及之后的版本，请在init方法之前调用此方法设置channel.
            //manService.manAnalytics.setChannel("某渠道")
            // MAN初始化方法之一，从AndroidManifest.xml中获取appKey和appSecret初始化
            manService.manAnalytics.init(this, applicationContext)
            // MAN另一初始化方法，手动指定appKey和appSecret
            // String appKey = "******";
            // String appSecret = "******";
            // manService.getMANAnalytics().init(this, getApplicationContext(), appKey, appSecret);
            // 若需要关闭 SDK 的自动异常捕获功能可进行如下操作,详见文档5.4
            //manService.manAnalytics.turnOffCrashReporter()
            // 通过此接口关闭页面自动打点功能，详见文档4.2
            //manService.manAnalytics.turnOffAutoPageTrack()
            // 若AndroidManifest.xml 中的 android:versionName 不能满足需求，可在此指定
            // 若在上述两个地方均没有设置appversion，上报的字段默认为null
            manService.manAnalytics.setAppVersion(BuildConfig.VERSION_NAME)
        }catch (ex:Throwable){
            this.printOrReport(ex)
        }
    }
}
